package com.librelato.persistencia;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.librelato.bean.ClienteBean;
import com.librelato.bean.EmpresaBean;
import com.librelato.bean.OrdemProducaoBean;
import com.librelato.bean.PedidoVendaBean;
import com.librelato.bean.ProdutoBean;
import com.librelato.bean.ProgramacaoProducaoBean;
import com.librelato.bean.RepresentanteBean;
import com.librelato.persistencia.config.SQLConfiguracao;
import com.librelato.persistencia.enums.EnumCondicao;
import com.librelato.persistencia.interfaces.IProgramacaoProducaoDao;
import com.librelato.util.Ferramentas;

public class ProgramacaoProducaoDao<P extends ProgramacaoProducaoBean> extends
		DaoGenerico<P> implements IProgramacaoProducaoDao<P> {

	@Override
	public String procuraPorParam(String tabela, String campo, String valor,
			EnumCondicao condicao) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public P salvar(P p) throws Exception {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void excluir(P p) throws Exception {
		// TODO Auto-generated method stub

	}

	@Override
	public void editar(P p) throws Exception {
		// TODO Auto-generated method stub

	}

	@Override
	public void preSalvar(P p) {
		// TODO Auto-generated method stub

	}

	@Override
	public List<ProgramacaoProducaoBean> buscaProgramacaoProducao(
			Map<String, String> param) throws Exception {

		List<ProgramacaoProducaoBean> programas = new ArrayList<ProgramacaoProducaoBean>();
		ProgramacaoProducaoBean programa = null;
		ClienteBean cliente = null;
		ProdutoBean produto = null;
		ResultSet rs2 = null;
		OrdemProducaoBean ordemProducao = null;
		PedidoVendaBean pedidoVendaBean = null;
		RepresentanteBean representante = null;
		int psIndex = 1;

		conn = GerenciadorConexao.getConexao();

		if (param.get("TIPOPRG").equals("PV")
				|| param.get("TIPOPRG").equals("OP")) {
			query = "SELECT ZPP_DATAC,C6_ENTREG,ZZQ_DESC,ZPF_STATUS,ZPP_FILORI,ZPP_FILIAL,ZPP_NUMERO,ZPP_SEQ,ZPP_SETOR,ZPP_TIPO,"
					+ "C6_CODPRJ,C2_NUM,C2_ITEM,C2_SEQUEN,A3_COD,A3_NOME  "
					+ "FROM ZPP010(NOLOCK) "
					+ "INNER JOIN ZZQ010(NOLOCK) "
					+ "ON ZZQ_CODIGO = ZPP_SETOR " + "AND ZPP_FILIAL = ? ";

			if (param.get("DATADE") != null) {
				query += "AND ZPP_DATAC >= ? ";
			}
			if (param.get("DATAATE") != null) {
				query += "AND ZPP_DATAC <= ? ";
			}
			if (param.get("SETORDE") != null) {
				query += "AND ZPP_SETOR >= ? ";
			}
			if (param.get("SETORATE") != null) {
				query += "AND ZPP_SETOR <= ? ";
			}
			query += "AND ZZQ_FILIAL = ZPP_FILIAL "
					+ "AND ZZQ010.D_E_L_E_T_ <> '*' "
					+ "AND ZPP010.D_E_L_E_T_ <> '*' "
					+ "INNER JOIN ZPF010(NOLOCK) "
					+ "ON ZPF_FILORI = ZPP_FILORI "
					+ "AND ZPF_NUMERO = ZPP_NUMERO "
					+ "AND ZPF010.D_E_L_E_T_ <> '*' "
					+ "LEFT JOIN SC5010 C5(NOLOCK) "
					+ "ON ZPF_FILORI = C5_FILIAL "
					+ "AND ZPF_NUMERO = C5_NUM "
					+ "LEFT JOIN SC6010(NOLOCK) "
					+ "ON C5_NUM = C6_NUM "
					+ "AND C5_FILIAL = C6_FILIAL "
					+ "AND C6_ITEM = '01' "
					+ "AND C5.D_E_L_E_T_ <> '*' "
					+ "AND SC6010.D_E_L_E_T_ <> '*' "
					+ "INNER JOIN SA3010(NOLOCK) "
					+ "ON A3_COD = C5_VEND2 "
					+ "AND SA3010.D_E_L_E_T_ <> '*' "
					+ "OUTER APPLY (SELECT TOP 1 C2_PEDIDO, C2_NUM,C2_ITEM,C2_SEQUEN,C2_FILIAL,C2_DATRF FROM SC2010(NOLOCK) "
					+ "INNER JOIN ZPF010(NOLOCK) "
					+ "ON ZPF_FILPRO = C2_FILIAL "
					+ "INNER JOIN SC5010(NOLOCK) " + "ON C5_NUM = C2_PEDIDO "
					+ "AND C5.C5_NUM = C5_NUM "
					+ "AND C5.C5_FILIAL = C5_FILIAL " + "AND C2_SEQUEN = '001'"
					+ "AND SC2010.D_E_L_E_T_ <> '*' "
					+ "AND SC5010.D_E_L_E_T_ <> '*' "
					+ "ORDER BY C2_EMISSAO DESC " + ") AS SC2 "
					+ " INNER JOIN SB1010(NOLOCK) " + "ON C6_PRODUTO = B1_COD "
					+ "AND SB1010.D_E_L_E_T_ <> '*' "
					+ "INNER JOIN SBM010(NOLOCK) " + "ON B1_GRUPO = BM_GRUPO "
					+ "AND SBM010.D_E_L_E_T_ <> '*' ";

			if (param.get("LINHA") != null) {
				if ("I1".equals(param.get("LINHA"))) {
					query += "AND BM_GRUREL IN ('2000','I1') ";
				} else {
					query += "AND BM_GRUREL IN ('1000','I2') ";
				}
			}

			query += " ORDER BY ZPP_SETOR,ZPP_DATAC,ZPP_SEQ";
		} else if (param.get("TIPOPRG").equals("SP")) {

			query = "SELECT B1_COD,B1_DESC,B1_GRUPO,ZPP_DATAC,'' AS C6_ENTREG,X5_DESCRI AS ZPF_STATUS,ZZ9_SOLICI,ZPP_FILORI,ZPP_FILIAL,ZPP_NUMERO,ZPP_SEQ,ZPP_SETOR,ZPP_TIPO,'-' AS C6_CODPRJ,ZZQ_DESC,C2_NUM,C2_ITEM,C2_SEQUEN,'-' AS A3_COD,'' AS A3_NOME  FROM ZPP010(NOLOCK) ";
			query += "INNER JOIN ZZ9010(NOLOCK) ";
			query += "ON ZZ9_FILORI = ZPP_FILORI ";
			query += "AND ZZ9_NUMSP = ZPP_NUMERO ";
			query += "AND ZPP010.D_E_L_E_T_ <> '*' ";
			query += "AND ZZ9010.D_E_L_E_T_ <> '*' ";
			query += "AND ZPP_FILIAL = ? ";
			query += "INNER JOIN SB1010(NOLOCK) ";
			query += "ON ZZ9_PRODUT = B1_COD ";
			query += "AND SB1010.D_E_L_E_T_ <> '*' ";
			query += "INNER JOIN SBM010(NOLOCK) ";
			query += "ON B1_GRUPO = BM_GRUPO ";
			query += "AND SBM010.D_E_L_E_T_ <> '*' ";
			query += "INNER JOIN ZZQ010(NOLOCK) ";
			query += "ON ZZQ_CODIGO = ZPP_SETOR ";
			query += "AND ZZQ010.D_E_L_E_T_ <> '*' ";
			query += "AND ZZQ_FILIAL = ZPP_FILIAL ";
			query += "INNER JOIN SX5010 ";
			query += "ON X5_CHAVE = ZZ9_STATUS ";
			query += "AND X5_TABELA = 'ZW'";
			query += "AND SX5010.D_E_L_E_T_ <> '*'";

			if (param.get("DATADE") != null) {
				query += "AND ZPP_DATAC >= ? ";
			}
			if (param.get("DATAATE") != null) {
				query += "AND ZPP_DATAC <= ? ";
			}
			if (param.get("SETORDE") != null) {
				query += "AND ZPP_SETOR >= ? ";
			}
			if (param.get("SETORATE") != null) {
				query += "AND ZPP_SETOR <= ? ";
			}

			if (param.get("LINHA") != null) {
				if ("I1".equals(param.get("LINHA"))) {
					query += "AND BM_GRUREL IN ('2000','I1') ";
				} else {
					query += "AND BM_GRUREL IN ('1000','I2') ";
				}
			}

			query += "OUTER APPLY (SELECT TOP 1 C2_PEDIDO, C2_NUM,C2_ITEM,C2_SEQUEN,C2_FILIAL,C2_DATRF ";
			query += "FROM SC2010(NOLOCK) ";
			query += "INNER JOIN ZPF010(NOLOCK) ";
			query += "ON ZZ9_FILIAL = C2_FILIAL ";
			query += "AND ZZ9_NUMOP = C2_NUM+C2_ITEM+C2_SEQUEN ";
			query += "AND C2_SEQUEN = '001' ";
			query += "AND SC2010.D_E_L_E_T_ <> '*' ";
			query += "ORDER BY C2_EMISSAO DESC ) AS SC2 ";

		}

		ps = conn.prepareStatement(query);
		ps.setString(psIndex++, param.get("FILIAL"));
		if (param.get("DATADE") != null) {
			ps.setString(
					psIndex++,
					Ferramentas.formataData(
							Ferramentas.formataData(param.get("DATADE"),
									"dd/MM/yy").getTime(), "yyyyMMdd"));
		}
		if (param.get("DATAATE") != null) {
			ps.setString(
					psIndex++,
					Ferramentas.formataData(
							Ferramentas.formataData(param.get("DATAATE"),
									"dd/MM/yy").getTime(), "yyyyMMdd"));
		}
		if (param.get("SETORDE") != null) {
			ps.setString(psIndex++, param.get("SETORDE"));
		}
		if (param.get("SETORATE") != null) {
			ps.setString(psIndex++, param.get("SETORATE"));
		}

		rs = ps.executeQuery();

		while (rs.next()) {
			programa = new ProgramacaoProducaoBean();
			if (!"".equals(rs.getString("ZPP_DATAC").trim())) {
				programa.setDataEmissao(Ferramentas.formataData(
						rs.getString("ZPP_DATAC"), "yyyyMMdd"));
			}
			if (rs.getString("C6_ENTREG") != null
					&& !"".equals(rs.getString("C6_ENTREG").trim())) {
				programa.setDataAgendamento(Ferramentas.formataData(
						rs.getString("C6_ENTREG"), "yyyyMMdd"));
			}
			programa.setDescriSetor(rs.getString("ZZQ_DESC").trim());
			programa.setEstagio(rs.getString("ZPF_STATUS").trim());
			programa.setFilialOrigem(rs.getString("ZPP_FILORI"));
			programa.setFilialProducao(rs.getString("ZPP_FILIAL"));
			programa.setNumero(rs.getString("ZPP_NUMERO").trim());
			programa.setPrioridade(rs.getInt("ZPP_SEQ"));
			programa.setSetor(rs.getString("ZPP_SETOR").trim());
			programa.setTipoProducao(rs.getString("ZPP_TIPO").trim());
			ordemProducao = new OrdemProducaoBean();
			ordemProducao.setFilial(new EmpresaBean(rs.getString("ZPP_FILIAL"),
					""));
			ordemProducao.setNumero(rs.getString("C2_NUM"));
			ordemProducao.setItem(rs.getString("C2_ITEM"));
			ordemProducao.setSequencia(rs.getString("C2_SEQUEN"));
			representante = new RepresentanteBean(rs.getString("A3_COD"),
					rs.getString("A3_NOME"));
			pedidoVendaBean = new PedidoVendaBean();
			pedidoVendaBean.setRepresentante(representante);
			pedidoVendaBean.setOrdemProd(ordemProducao);
			programa.setPedidoVenda(pedidoVendaBean);
			if ("PV".equals(rs.getString("ZPP_TIPO").trim())) {
				query = SQLConfiguracao.getInstance().getValor(
						"localiza_pedido_cliente");
				ps = conn.prepareStatement(query);
				ps.setString(1, programa.getFilialOrigem());
				ps.setString(2, programa.getNumero());
				rs2 = ps.executeQuery();
				if (rs2.next()) {
					cliente = new ClienteBean();
					cliente.setCodigo(rs2.getString("C5_CLIENTE").trim());
					cliente.setNome(rs2.getString("A1_NOME").trim());
					programa.setCliente(cliente);
					produto = new ProdutoBean();
					produto.setCodigo(rs2.getString("B1_COD").trim());
					produto.setDescricao(rs2.getString("B1_DESC").trim());
					produto.setGrupo(rs2.getString("B1_GRUPO"));
					produto.setCodigoProjeto(rs2.getString("C6_CODPRJ"));
					programa.setProduto(produto);
				}
			} else if ("OP".equals(rs.getString("ZPP_TIPO").trim())) {
				cliente = new ClienteBean();
				cliente.setCodigo("--");
				cliente.setNome("--");
				programa.setCliente(cliente);

				query = SQLConfiguracao.getInstance().getValor(
						"localiza_op_programada");
				ps = conn.prepareStatement(query);
				ps.setString(1, programa.getFilialOrigem());
				ps.setString(2, programa.getNumero().trim().substring(0, 6));
				ps.setString(3, programa.getNumero().trim().substring(6, 8));
				ps.setString(4, programa.getNumero().trim().substring(8, 11));
				rs2 = ps.executeQuery();
				if (rs2.next()) {
					programa.setCliente(cliente);
					produto = new ProdutoBean();
					produto.setCodigo(rs2.getString("B1_COD").trim());
					produto.setDescricao(rs2.getString("B1_DESC").trim());
					produto.setGrupo(rs2.getString("B1_GRUPO"));
					produto.setCodigoProjeto(rs2.getString("C6_CODPRJ"));
					programa.setProduto(produto);
				}
			} else {
				cliente = new ClienteBean();
				cliente.setCodigo("--");
				cliente.setNome(rs.getString("ZZ9_SOLICI"));
				programa.setCliente(cliente);
				produto = new ProdutoBean();
				produto.setCodigo(rs.getString("B1_COD").trim());
				produto.setDescricao(rs.getString("B1_DESC").trim());
				produto.setGrupo(rs.getString("B1_GRUPO"));
				produto.setCodigoProjeto("--");
				programa.setProduto(produto);
			}
			programas.add(programa);

		}
		return programas;
	}
}
